package br.com.sisgerenciamento.facade.cliente;

import java.util.ArrayList;

import br.com.sisgerenciamento.dao.cliente.ClienteDAOService;
import br.com.sisgerenciamento.dto.cliente.ClienteDTO;
import br.com.sisgerenciamento.exceptions.AlterarException;
import br.com.sisgerenciamento.exceptions.ApplicationException;
import br.com.sisgerenciamento.exceptions.InserirException;
import br.com.sisgerenciamento.model.cliente.ClienteVO;
import br.com.sisgerenciamento.spring.ConfiguracaoSpring;
import br.com.sisgerenciamento.utilidades.Validator;

public class ClienteFacade{

	private static ClienteFacade clienteFacade;
	private ClienteDAOService dao;

	public static ClienteFacade getInstance(){
		if(clienteFacade == null){
			clienteFacade =  new ClienteFacade();
		}
		return clienteFacade;
	}
	
	private ClienteFacade(){
		dao = (ClienteDAOService) ConfiguracaoSpring.SPRING_BEAN_FACTORY.getBean( "clienteDAO" );
	}
	
	public ClienteDTO salvar(ClienteDTO dto){
		try {
			ClienteVO vo = dto.getVO();
			if(Validator.novo().isNullOrZero(vo.getCodigo())){
				vo = dao.inserir(vo);
			}else{
				dao.alterar(vo);
			}
			dto = dao.consultarPorCodigo(vo.getCodigo()).getDTO();
		} catch (InserirException e) {
			e.printStackTrace();
		} catch (ApplicationException e) {
			e.printStackTrace();
		} catch (AlterarException e) {
			e.printStackTrace();
		}
		return dto;
	}
	
	public ClienteDTO consultarPorCodigo(Long codigo){
		ClienteDTO dto = new ClienteDTO();
		try {
			ClienteVO vo = dao.consultarPorCodigo(codigo);
			if(vo != null)
				dto = vo.getDTO();
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dto;
	}
	
	public ClienteDTO consultarPorNomeExato(String nomeCliente){
		try {
			ClienteVO vo = dao.consultarPorNomeExato(nomeCliente);
			if(vo != null)
				return vo.getDTO();
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public ArrayList<ClienteDTO> buscarPorNome(String nome){
		ArrayList<ClienteDTO> dtos = new ArrayList<ClienteDTO>();
		try {
			ArrayList<ClienteVO> vos = new ArrayList<ClienteVO>();
			vos = dao.consultarClientePorNome(nome);
			
			for (ClienteVO clienteVO : vos) {
				dtos.add(clienteVO.getDTO());
			}
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dtos;
	}
	
	public ArrayList<String> autoComplete(String nome){
		try {
			return dao.consultarPorNome(nome);
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public ArrayList<ClienteDTO> listarAtivos(){
		ArrayList<ClienteDTO> dtos = new ArrayList<ClienteDTO>();
		try {
			ArrayList<ClienteVO> vos = new ArrayList<ClienteVO>();
			vos = dao.listarAtivos();
			for (ClienteVO clienteVO : vos) {
				dtos.add(clienteVO.getDTO());
			}
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dtos;
	}
	
	
}
